package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**通过提高每次读写的数据量减少实际读写的次数,可以提供写的效率*/
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("gu.jpg");
        FileOutputStream fos = new FileOutputStream("gu_cp2.jpg");

        /*
        long start = System.currentTimeMillis();
        byte[] data = new byte[1024*10]; //10k
        while (fis.read(data)!=-1){ //每次读取10kb并判断是否读取到了结尾
            fos.write(data); //一次写入10kb
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时"+(end-start)+"ms");
        fis.close();
        fos.close();
         */

        /*
           InputStream超类中定义了快读取数据的方法:
           int read(bute[] data)
           一次性读取给定的字节数组data总长度的字节量,并存入到字节数中,
           返回值表示实际读取到了多少个字节,若返回-1表示堵到了末尾

           OutputStream超类上也定义了块写字节的方法:
           void write(byte[] data)
           一次性将给定的字节数组中的所有字节写出

           void write(byte[] dtaa,int offset,int len)
           一次性将给定的字节数组data从下标offset处开始的连续len个字节写出
         */
        long start = System.currentTimeMillis();
        byte[] data = new byte[1024*10]; //10kb
        int len; //记录每次实际读取的字节数
        while ((len=fis.read(data))!=-1){ //每次读取10kb并判断是否读取到了结尾
            //将字节数组byte从下标0开始连续len个字节写出(做到读多少就写多少)
            fos.write(data,0,len); //一次写入10kb
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时"+(end-start)+"ms");
        fis.close();
        fos.close();
    }
}
